package com.ohc.leetcode.数组.repect;

import java.util.*;

/**
 * 2022年5月3日23:31:30
 */
public class 移动零01 {
    //    0 2 3
    // 2 0 3
    // 2 3 0
//     2 3 0
    public static void moveZeroes1(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0) {
                for (int j = i; j < nums.length - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                nums[nums.length - 1] = 0;
            }
        }
        System.out.println(Arrays.toString(nums));

    }

    public static void moveZeroes2(int[] nums) {
        int length = nums.length;
        for (int index = 0; index < length; index++) {
            // 找到0元素的索引
            if (nums[index] == 0) {
                // 根据索引删除元素
                for (int i = index; i < length - 1; i++) {
                    nums[i] = nums[i + 1];
                }
                // 回调指针，因为正向删除的时候，可能会有2个相邻的元素，然后删除了索引为2的元素，然后移动元素 2还是0，但是下标已经移动
//                到3了，所以会漏删
                index--;
                // 元素数量-1
                length--;
                continue;
            }
        }
        // 补0
        for (int i = length; i < nums.length; i++) {
            nums[i] = 0;
        }
    }

    public static void moveZeroes3(int[] nums) {
        int fast = 0;
        int slow = 0;
        int length = nums.length;
        int temp = 0;
//        0 1 0
//        1 0 0
        while (fast < length) {
            if (nums[fast] == 0) {
                fast++;
            } else {
//                交换元素
                temp = nums[slow];
                nums[slow] = nums[fast];
                nums[fast] = temp;
                fast++;
                slow++;
            }
        }


    }


    public static void main(String[] args) {
        int[] nums = new int[]{0, 1, 0, 3, 12};
        moveZeroes3(nums);
        for (int num : nums) {
            System.out.println("num = " + num);
        }
        Arrays.toString(nums);
    }
}
